/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: recv.c
> Author:cjy
> Mail: 
> Created Time: 2024年08月06日 星期二 22时50分56秒
***************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf{
    long mtype;   // 消息类型
    char mtext[200]; 
};

typedef struct use_info{
	int key;
    	char txt[100];
    
} USE;

int main(int argc, const char* argv[])
{
    char path[50] = {0};
    key_t key = 0; // 消息队列标识符
    int msgid = 0; // 消息队列 ID
    int ret = 0; // 函数返回值

    printf("请输入路径:");
    scanf("%s", path);

    key = ftok(path, 1); // 使用 ftok 生成一个唯一的 key
    if (key == -1) {
        perror("ftok");
        exit(-1);    
    }

    msgid = msgget(key, IPC_CREAT | 0666); // 创建或获取消息队列
    if (msgid == -1) {
        perror("msgget");
        exit(-1);    
    }

// 接受
    struct msgbuf data;
    memset(&data, 0, sizeof(struct msgbuf));
        ret = msgrcv(msgid, &data, sizeof(struct msgbuf) - sizeof(long), 1, 0);
        if (ret == -1) {
            perror("msgrcv");
            exit(-1);          // 遇到错误退出程序
        }
	if (strcmp(data.mtext, "EOF") == 0) {
            break;
        }

        USE k;
        memcpy(&k, data.mtext, sizeof(USE));
        printf("%d:\n", k.key);
        printf("%s\n", k.txt);


    // 发送消息
	USE use_to;
	use_to.key = key; 
	scanf("%s",use_to.txt);
	struct msgbuf msg;
	msg.mtype = 2;
	memcpy(msg.mtext,&use_to,sizeof(USE));
	ret = msgsnd(msgid,&msg,sizeof(USE),0);
	if (ret == -1) {
            perror("msgsnd");
            exit(-1);
        }

	// 再单独发送完成标志
    struct msgbuf eofMsg;
    eofMsg.mtype = 1;
    memset(eofMsg.mtext, 0, sizeof(eofMsg.mtext));
    strcpy(eofMsg.mtext, "EOF");
    ret = msgsnd(msgid, &eofMsg, sizeof(eofMsg.mtext), 0);
    if (ret == -1) {
        perror("msgsnd");
        exit(-1);
    }

    // 删除消息队列
    //ret = msgctl(msgid, IPC_RMID, NULL);
    //if (ret == -1) {
    //    perror("msgctl");
    //    exit(-1);
    //}

    //printf("完成接收并发送了确认消息。\n");

    return 0;
}

